package com.itheima.a09threadsafe1;

public class ThreadDemo {

    /**
     * 线程安全
     *
     * 下面这样一起买票
     *  ticket就要设置成静态的了
     *
     *  这时候会出现 ticket > 100的问题      -- 多线程争取同一个变量时的同步问题  -- ticket 是临界资源
     *
     *  买票引起的安全问题
     *      -- 票号会重复
     *      -- 票号会超过100
     *     == 因为线程在循环条件成立的时候 线程就会进去试图将 ticket ++ 但是会先睡 100 ms 此时CPU可能被其他的线程抢走
     *     重复票是因为一个线程执行完 ticket ++ 的时候可能还没来得及打印CPU就被抢走了 当醒来后他还是执行打印 。 只是现在打印的就是 ticket 后面的值了
     *          此时可能一个线程在 ticket < 100 时进入了循环 但是睡了过后 ticket > 100 了但这个线程还是会将 ticket ++
     *
     *     根本原因是 ticket 邻接资源被共享访问了
     *     要把对临界区资源的访问锁起来
     *
     *     synchronized(锁) {
     *         操作共享数据 的代码
     *     }
     *
     *     1.当有线程进入共享代码的时候锁自动关闭（默认打开）
     *     2.线程执行完共享区代码 ， 锁自动打开
     *
     *     此时如果线程1抢到了CPU 锁关闭了 线程2 和 线程3会被阻塞在外面 即使抢到CPU也不运行
     *     直到线程1把循环执行完锁打开
     *     所以synchronized要写在线程里面
     *
     * @param args
     */
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        MyThread myThread3 = new MyThread();

        //起名字
        myThread1.setName("窗口1");
        myThread2.setName("窗口2");
        myThread3.setName("窗口3");

        //开启
        myThread1.start();
        myThread2.start();
        myThread3.start();
    }
}
